// 传统的面向对象
// 类是对象的属性和方法模板,抽象
// class Dog {
//     // 构造函数
//     constructor(type,color){
//         this.type=type;
//         this.color=color;
//     }
//     makeSound(){
//         console.log('汪汪汪');
//     }
//     eat(){
//         console.log('骨头来一根');
//     }
// }


// js 原型式的面向对象
//构造函数
function Dog(type,color){
    this.type = type;
    this.color = color;
}
// 任何函数都有一个prototype 对象， 方法
// Dog.prototype xb smy 关系?
// 共同的实例 共享的方法
// Dog.prototype {}
Dog.prototype = {
    makeSound :function(){
    console.log(`${this.type} 汪汪汪`);  //this 指向 实例
    },
    eat :function(){
    console.log('骨头来一根');
    }
}

//构造函数(属性) - 原型对象(方法) - 实例
// 1. 把构造函数运行一下
// 2. 以new的方式运行this —> xb

const xb = new Dog('土狗','白色');
const smy = new Dog('萨摩耶','白色');
// xb Dog.prototype 之间的关系
console.log(xb instanceof Dog);
console.log(xb.__proto__.constructor);
// 私有属性 
// 实例对象都有一个__proto__属性, 指向构造函数的prototype对象
// xb 构造器有没有相应的属性,可以去原型对象(prototype)上查找.
// xb.prototype.makeSound(); -->  false
console.log(xb.__proto__,'----');  // 相当于一个指针 指向原型对象
xb.makeSound()
// 相同的地方 
console.log(xb.constructor == smy.constructor);